﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
////类模板的偏特化
//普通类模板
template<class T>
class Less
{
public:
	bool operator()(const T& a1, const T& a2)
	{
		return a1 < a2;
	}
};
//偏特化类模板
template<class T>
class Less<T*>
{
public:
	bool operator()(T* const& a1, T* const& a2)
	{
		return *a1 < *a2;
	}
};
//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////2
////这个template后面的可以为typename也可以为class，这个是没有区别的
////两个参数偏特化为指针类型
////template <typename T1, typename T2>
//template <class T1, class T2>
//class Data <T1*, T2*>
//{
//public:
//	Data() { cout << "Data<T1*, T2*>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////两个参数偏特化为引用类型
////template <class T1, class T2>
//template <typename T1, typename T2>
//class Data <T1&, T2&>
//{
//public:
//	Data(const T1& d1, const T2& d2)
//		: _d1(d1)
//		, _d2(d2)
//	{
//		cout << "Data<T1&, T2&>" << endl;
//	}
//private:
//	const T1& _d1;
//	const T2& _d2;
//};
////1
//template<class T1>
//class Data<T1, int>
//{
//public:
//	Data() { cout << "Data<T1, int>" << endl; }
//private:
//	T1 _d1;
//	int _d2;
//};
//template<class T2>
//class Data<int, T2>
//{
//public:
//	Data() { cout << "Data<int, T2>" << endl; }
//private:
//	int _d1;
//	T2 _d2;
//};
////类模板
////类模板的全特化
////普通类模板
//template<class T>
//class Less
//{
//public:
//	bool operator()(const T& a1, const T& a2)
//	{
//		return a1 < a2;
//	}
//};
////特化类模板
//template<>
//class Less<Date*>
//{
//public:
//	bool operator()(Date* const& a1, Date* const& a2)
//	{
//		return *a1 < *a2;
//	}
//};
////普通类模板
//template<class T1, class T2>
//class Data
//{
//public:
//	Data() { cout << "Data<T1, T2>" << endl; }
//private:
//	T1 _d1;
//	T2 _d2;
//};
////全特化类版本
//template<>
//class Data<int, char>
//{
//public:
//	Data() { cout << "Data<int, char>" << endl; }
//private:
//	int _d1;
//	char _d2;
//};
////函数模板的特化
//class Date
//{
//	friend ostream& operator<<(ostream& _cout, const Date& d);
//public:
//	Date(int year,int month,int day)
//		:_year(year)
//		,_month(month)
//		,_day(day)
//	{ }
//	bool operator<(const Date& d)const
//	{
//		return (_year < d._year) ||
//			(_year == d._year && _month < d._month) ||
//			(_year == d._year && _month == d._month && _day < d._day);
//	}
//
//	bool operator>(const Date& d)const
//	{
//		return (_year > d._year) ||
//			(_year == d._year && _month > d._month) ||
//			(_year == d._year && _month == d._month && _day > d._day);
//	}
//private:
//	int _year = 2025;
//	int _month = 1;
//	int _day = 1;
//};
//template<class T>
//bool Less(const T& left,const T& right)
//{
//	return left < right;
//}
//template<>
//bool Less<Date*>(Date* const& left, Date* const& right)
//{
//	return *left < *right;
//}
// 函数模板 -- 参数匹配
//template<class T>
//bool Less(T left, T right)
//{
//	return left < right;
//}
//template<>
//bool Less<Date*>(Date* left, Date* right)
//{
//	return *left < *right;
//}
//bool Less(Date* left, Date* right)
//{
//	return *left < *right;
//}
//ostream& operator<<(ostream& _cout, const Date& d)
//{
//	_cout << d._year << "-" << d._month << "-" << d._day;
//	return _cout;
//}
//
//int main()
//{
//	cout << Less(1, 2) << endl; // 可以比较，结果正确
//	Date d1(2025, 7, 7);
//	Date d2(2025, 7, 8);
//	cout << Less(d1, d2) << endl; 
//	Date* p1 = &d1;
//	Date* p2 = &d2;
//	cout << Less(p1, p2) << endl; 
//	return 0;
//}
////非类型模板参数
//template<class T,size_t N=10>
//class mystack
//{
//private:
//	T _a[N];
//	int _top;
//};
//int main()
//{
//	//定义一个能存储10个元素的栈
//	mystack<int> k1;
//	//定义一个能存储20个元素的栈
//	mystack<int, 20> k2;
//	return 0;
//}
////(1)
//template<class T>
//class big
//{
//public:
//	int operator()(int x, int y)
//	{
//		return x > y ? x : y;
//	}
//};
////(2)
//template<class T>
//class Less
//{
//public:
//	bool operator()(int x, int y)
//	{
//		return x < y;
//	}
//};
//#include<iostream>
//using namespace std;
//int main()
//{
//	big<int> B;
//	cout << B(5, 10) << endl;
//	cout << B.operator()(39, 45) << endl;
//	Less<int> l;
//	if (l(4, 5))
//	{
//		cout << "4<5" << endl;
//	}
//	else
//	{
//		cout << "4>5" << endl;
//	}
//	return 0;
//}